import browser from './browser'
import formula from './formula'
import { datagridgrowth } from './getdata'
import { jfrefreshgrid, jfrefreshgridall, jfrefreshrange } from './refresh'
import { getSheetIndex } from '../methods/get'
import Store from '../store'
import $ from 'jquery'

const editor = {
    //worker+blob实现深拷贝替换extend
    deepCopyFlowDataState:false,
    deepCopyFlowDataCache:'',
    deepCopyFlowDataWorker:null,
    deepCopyFlowData:function(flowData){
        let _this = this

        if(_this.deepCopyFlowDataState){
            if(_this.deepCopyFlowDataWorker != null){
                _this.deepCopyFlowDataWorker.terminate()
            }
            return _this.deepCopyFlowDataCache
        }
        else{
            if(flowData == null){
                flowData = Store.flowdata
            }

            return $.extend(true, [], flowData)
        }
    },
    webWorkerFlowDataCache:function(flowData){
        let _this = this

        try{
            if(_this.deepCopyFlowDataWorker != null){//存新的webwork前先销毁以前的
                _this.deepCopyFlowDataWorker.terminate()
            }

            let funcTxt = 'data:text/javascript;charset=US-ASCII,onmessage = function (e) { postMessage(e.data); };'
            _this.deepCopyFlowDataState = false

            //适配IE
            let worker
            if(browser.isIE() == 1){
                let response = 'self.onmessage=function(e){postMessage(e.data);}'
                worker = new Worker('./plugins/Worker-helper.js')
                worker.postMessage(response)
            }
            else{
                worker = new Worker(funcTxt)
            }

            _this.deepCopyFlowDataWorker = worker
            worker.postMessage(flowData)
            worker.onmessage = function(e) {
                _this.deepCopyFlowDataCache = e.data
                _this.deepCopyFlowDataState = true
            }
        }
        catch(e){
            _this.deepCopyFlowDataCache = $.extend(true, [], flowData)
        }
    },

    /**
     * @param {Array} dataChe
     * @param {Object} range 是否指定选区，默认为当前选区
     * @since Add range parameter. Update by siwei@2020-09-10.
     */
    controlHandler: function (dataChe, range) {
        let _this = this

        let d = _this.deepCopyFlowData(Store.flowdata)//取数据

        // let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
        let last = range || Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
        let curR = last['row'] == null ? 0 : last['row'][0]
        let curC = last['column'] == null ? 0 : last['column'][0]
        let rlen = dataChe.length, clen = dataChe[0].length

        let addr = curR + rlen - d.length, addc = curC + clen - d[0].length
        if(addr > 0 || addc > 0){
            d = datagridgrowth([].concat(d), addr, addc, true)
        }

        for (let r = 0; r < rlen; r++) {
            let x = [].concat(d[r + curR])
            for (let c = 0; c < clen; c++) {
                let value = ''
                if (dataChe[r] != null && dataChe[r][c] != null) {
                    value = dataChe[r][c]
                }
                x[c + curC] = value
            }
            d[r + curR] = x
        }

        if (addr > 0 || addc > 0) {
            jfrefreshgridall(d[0].length, d.length, d, null, Store.luckysheet_select_save, 'datachangeAll')
        }
        else {
            jfrefreshrange(d, Store.luckysheet_select_save)
        }
    },
    clearRangeByindex: function (st_r, ed_r, st_c, ed_c, sheetIndex) {
        let index = getSheetIndex(sheetIndex)
        let d = $.extend(true, [], Store.luckysheetfile[index]['data'])

        for (let r = st_r; r <= ed_r; r++) {
            let x = [].concat(d[r])
            for (let c = st_c; c <= ed_c; c++) {
                formula.delFunctionGroup(r, c)
                formula.execFunctionGroup(r, c, '')
                x[c] = null
            }
            d[r] = x
        }

        if(sheetIndex == Store.currentSheetIndex){
            let rlen = ed_r - st_r + 1,
                clen = ed_c - st_c + 1

            if (rlen > 5000) {
                jfrefreshgrid(d, [{ 'row': [st_r, ed_r], 'column': [st_c, ed_c] }])
            }
            else {
                jfrefreshrange(d, { 'row': [st_r, ed_r], 'column': [st_c, ed_c] })
            }
        }
        else{
            Store.luckysheetfile[index]['data'] = d
        }
    },
    controlHandlerD: function (dataChe) {
        let _this = this

        let d = _this.deepCopyFlowData(Store.flowdata)//取数据

        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
        let r1 = last['row'][0], r2 = last['row'][1]
        let c1 = last['column'][0], c2 = last['column'][1]
        let rlen = dataChe.length, clen = dataChe[0].length

        let addr = r1 + rlen - d.length, addc = c1 + clen - d[0].length
        if(addr >0 || addc > 0){
            d = datagridgrowth([].concat(d), addr, addc, true)
        }

        for(let r = r1; r <= r2; r++){
            for(let c = c1; c <= c2; c++){
                d[r][c] = null
            }
        }

        for(let i = 0; i < rlen; i++){
            for(let j = 0; j < clen; j++){
                d[r1 + i][c1 + j] = dataChe[i][j]
            }
        }

        let range = [
            { 'row': [r1, r2], 'column': [c1, c2] },
            { 'row': [r1, r1 + rlen - 1], 'column': [c1, c1 + clen - 1] }
        ]

        jfrefreshgrid(d, range)
    }
}

export default editor
